/**
 * 1. 搭建ts开发环境
 *  npm i typescript -g    ------>  tsc -v
 *  npm i ts-node -g       ------>  ts-node
 *  tsc --init 在当前文件下生成tsconfig.json文件;
 *  生成ts的react脚手架命令：create-react-app my-app --template typescript
 *
 * 2. 写ts代码  类型注解
 *
 * ts代码讲解：
 * 1. 基本类型
 * 2. 接口
 * 4. 函数
 * 5. 泛型
 * 3. 类
 * 6. 枚举
 *
 */
// ts 基本类型  number string boolean undefined Symbol null;
// 注解
// const a = 1;
// const b: string = "hello world";
// const c: boolean = true;
// const d: null = null;
// const e: undefined = undefined;
// const f: Symbol = Symbol();
// void 空
// function test(page: number): void {
//   return
// }
// test(1) // "1" : string

// function test({ page, size, total }: { page: number, size: number, total: number }): void {
//   return
// }
// test({ page: 1, size: 5, total: 1 }) // "1" : string

// 2. 接口 
interface ITest {
  page?: number,
  size?: number,
  total?: number, // 可传可不传
  fn: () => void,
  obj: {
    name: string,
    age: number
  }
}

// function test(opt: ITest): void {
//   return
// }
// test({}) // "1" : string

/**
 * @function 泛型
 * 1. 括号前面传参数
 * 2. 括号前面接受参数
 * 3. 接受到之后，冒号后面使用
 */

// function test<T>(opt: T) {
//   // return { page: 1, size: 4 }
// }
// test<ITest>({ fn: () => { }, obj: { name: 'devin', age: 14 } })

/**
 * @function 类
 * class {} 属性 方法
 */

interface IProps {
  name: string,
  age: number
}

// class Person<T> {
//   props
//   constructor(props: T) {
//     this.props = props
//   }
//   eat() {
//     console.log('eat')
//   }
//   speak() {
//     console.log('speak')
//   }
// }
// let p = new Person<IProps>({ name: '', age: 1 })

/**
 * @function 修饰器
 * 1. 修饰器就是一个函数 （eg:testDec）
 * 2. 修饰器调用通过 @符号
 * 
 */
function test(flag: boolean) {
  if (flag) {
    return function testDec(constructor: any) {
      constructor.prototype.getName = function () {
        console.log("getName")
      }
    }
  } else {
    return function testDec(constructor: any) {
    }
  }
}

@test(false)
class Student {
}

let s = new Student();
// 类型断言
(s as any).getName()



